Diese Präsentation behandelt den Aufbau, die Funktionen und die Konfigurationsmöglichkeiten von HTTP-Servern, insbesondere des Apache HTTP-Servers, sowie anderer verbreiteter HTTP-Server wie Microsoft Internet Information Services (IIS). Ziel ist es, ein Verständnis der Serverarchitektur und der Konfiguration zu vermitteln. Der Apache HTTP Server ist ein quelloffenes und freies Produkt der Apache Software Foundation und der meistbenutzte Webserver im Internet. Neben Unix und Linux unterstützt Apache MS Windows sowie eine Vielzahl weiterer Betriebssysteme. Der Apache-Webserver ist modular aufgebaut. So kann er zum Beispiel die Kommunikation zwischen Browser und Webserver verschlüsseln (modul-ssl), als Proxyserver eingesetzt werden (modul-proxy) oder komplexe Manipulationen von HTTP-Kopfdaten (modul-headers) und URLs (modul-rewrite) durchführen. Er bietet die Möglichkeit, mittels serverseitiger Skriptsprachen Webseiten dynamisch zu erstellen. Häufig verwendete Skriptsprachen sind PHP, Perl oder Ruby. Zu den grundlegenden Einstellungen des Apache-Servers gehören Log-Dateien zur Protokollierung von Zugriffen (access-log) und Fehlern (error-log), Timeouts zur Festlegung der Zeitlimits für das Senden und Empfangen von Daten sowie MIME-Typen zur Definition der Dateiformate, die der Server korrekt senden kann. Andere Dateitypen werden standardmäßig als text-plain gesendet, wenn keine spezifischen MIME-Typen definiert sind. Viele grundlegende Einstellungen werden in der Konfigurationsdatei httpd.conf vorgenommen. Änderungen in dieser Datei erfordern einen Neustart des Servers. Wichtige Einstellungen umfassen: ServerRoot gibt das Wurzelverzeichnis der Apache-Installation an, "Listen 80" zur Festlegung des HTTP-Ports, ServerAdmin mit der E-Mail-Adresse des Administrators, ServerName mit dem Namen des Servers sowie DocumentRoot als Ablageort der Website-Dokumente, dazu gehören die HTML-, JavaScript- und CSS-Dateien. Alias-Verzeichnisse ermöglichen die Abbildung einer URL auf ein anderes Verzeichnis, sodass Dokumente außerhalb des DocumentRoot liegen können. ScriptAlias definiert die Abbildung einer URL auf ein Skript-Verzeichnis, wobei die Dateien ausgeführt und nicht direkt an den Client gesendet werden. Das Ergebnis der Ausführung wird dann an den Client gesendet. Der Zugriff auf Verzeichnisse innerhalb des DocumentRoot kann in der httpd.conf konfiguriert werden. Dort kann man auch einstellen, dass Benutzer selbst die Zugriffsrechte auf ihre Verzeichnisse per .htaccess-Datei konfigurieren können. Der Name der Konfigurationsdatei wird in der httpd.conf Datei definiert, typischerweise mit AccessFileName .htaccess. Die Verwendung dieser Konfigurationsdatei muss in der httpd.conf freigegeben werden mit dem Befehl AllowOverride All. Die .htaccess-Datei bezieht sich nur auf das Verzeichnis, in dem sie liegt. Berechtigungen werden durch Deny- und Allow-Anweisungen beschrieben. Die Folie zeigt eine grafische Darstellung der Zugriffsberechtigungen auf einem Apache HTTP-Server. Die grüne Menge "Allow" repräsentiert die Ressourcen, die explizit in der Allow-Direktive enthalten sind. Zugriffe, die nur in Allow enthalten sind, werden erlaubt. Die rote Menge "Deny" steht für die Ressourcen, die explizit in der Deny-Direktive enthalten sind. Zugriffe, die nur in Deny enthalten sind, werden verboten. Die überlappende Fläche zwischen Allow und Deny zeigt die Ressourcen, die sowohl in Allow als auch in Deny enthalten sind. Der Status dieser Ressourcen ist unklar, da sie gleichzeitig erlaubt und verboten sind. Hier ist eine eindeutige Regelung erforderlich. Dasselbe Problem ergibt sich bei Ressourcen, die weder in Allow noch in Deny enthalten sind. Der Zugriff auf diese Ressourcen ist unklar, da sie in keiner Direktive spezifiziert sind. Die Zugriffsentscheidung hängt von den Standard-Einstellungen des Servers ab. Eine Möglichkeit zur Lösung ist die Reihenfolge der Regeln "Order Deny,Allow". Die Deny-Anweisung wird dabei zuerst ausgewertet. Erst danach wird die Allow-Anweisung ausgewertet. Sie kann eine Deny-Anweisung überschreiben. Ein Zugriff, der nicht explizit in Deny enthalten ist, wird erlaubt. Dies ist eine sehr offene Definition der Zugriffsberechtigungen. Anders herum kann man die Definition der Reihenfolge für Regeln "Order Allow,Deny" vergeben. Die Allow-Anweisung wird dabei zuerst ausgewertet. Erst danach wird die Deny-Anweisung ausgewertet. Sie kann eine Allow-Anweisung überschreiben. Ein Zugriff, der nicht explizit in Allow enthalten ist, wird verboten. Dies ist aus Aspekten der sicheren Administration sehr zu empfehlen. Hier sehen Sie Beispiele für solche Regeln. Jeder darf zugreifen ohne jede Beschränkung mit "Order Allow,Deny" und "Allow from all" oder niemand hat Zugriff mit "Order Deny,Allow" und "Deny from all". Auf dieser Basis kann man nun individuelle Regeln für bestimmte IP-Bereiche und für einzelne IP-Adressen definieren. Kommen wir nun zu den wichtigsten Modulen, die man sehr individuell in den Apache-Webserver integrieren kann. Mit mod-cgi kann man beliebige CGI-Skripte ausführen. Mit mod-perl kann man Perl-Skripte ausführen. Mit mod-php kann man PHP-Skripte ausführen. Mit mod-python kann man Python-Skripte ausführen. Mit mod-rewrite kann man URLs umleiten. Mit mod-jk kann man eine Verbindung zu einem Java-Server herstellen. Mit mod-proxy kann der Apache als Proxy-Server fungieren. Apache Tomcat ist ein Open Source Webserver und Webcontainer, der die Spezifikation für Java Servlets und JavaServer Pages implementiert. Er erlaubt es, in Java geschriebene Web-Anwendungen auf Servlet- beziehungsweise JSP-Basis auszuführen. Tomcat besteht aus dem eigentlichen Servlet-Container Catalina, der JSP-Engine Jasper und dem Connector-Framework Coyote. Mittels verschiedener Konnectoren unterstützt Tomcat diverse Kommunikationsprotokolle und kann mit dem HTTP-Connector entweder als eigenständiger Webserver betrieben oder mittels eines Connectors in andere Webserver integriert werden. Die Abbildung zeigt die Integration des Apache HTTP Servers mit dem Apache Tomcat Server, um eine nahtlose Verarbeitung von HTTP-Anfragen und die Ausführung von Java-basierten Webanwendungen zu ermöglichen. Diese Integration nutzt das mod-jk Modul, um Anfragen zwischen dem Apache HTTP Server und dem Tomcat Servlet Container weiterzuleiten. Auf der linken Seite befindet sich der Client, der eine HTTP-Anfrage stellt. Der Client könnte ein Webbrowser oder ein anderes Programm sein, das eine Webanfrage sendet. Die erste Komponente nach dem Client ist der Apache HTTP-Server. Dieser Server empfängt die HTTP-Anfrage vom Client. Der Apache HTTP Server besteht aus dem Kernmodul und dem Modul mod-jk. Dieses Modul ist für die Kommunikation zwischen dem Apache HTTP-Server und dem Tomcat Servlet Container verantwortlich. Es leitet bestimmte Anfragen, die für Java Servlets oder JavaServer Pages bestimmt sind, vom Apache HTTP Server an den Tomcat Servlet Container weiter. Unter dem Apache HTTP Server ist ein Datenspeicher dargestellt, der die Dateien speichert, die vom Apache HTTP-Server direkt bedient werden, wie statische HTML-Seiten, Bilder und andere Ressourcen. Auf der rechten Seite der Abbildung befindet sich der Tomcat Servlet Container, der innerhalb einer Java Virtual Machine läuft. Der Tomcat Server ist darauf spezialisiert, Java-basierte Webanwendungen auszuführen, insbesondere Servlets und JSPs. Der Servlet Container Tomcat wird innerhalb der Java Virtual Machine betrieben, die die Laufzeitumgebung für die Java-Anwendungen bereitstellt. Innerhalb des Tomcat Servlet Containers befinden sich die Servlets und JavaServer Pages, die die dynamische Generierung von Inhalten basierend auf den Anfragen des Clients ermöglichen. Unter dem Tomcat Servlet Container ist ein weiterer Datenspeicher dargestellt, der die Dateien speichert, die vom Tomcat Server bedient werden, wie Java-Klassen und JSP-Dateien. Die Funktionsweise der Integration ist wie folgt: Der Client sendet eine HTTP-Anfrage, die beim Apache HTTP-Server ankommt. Der Apache HTTP-Server verarbeitet die Anfrage. Für statische Inhalte wie HTML-Seiten oder Bilder wird die Anfrage direkt vom Apache HTTP-Server beantwortet. Wenn die Anfrage eine dynamische Ressource betrifft, die von einem Servlet oder einer JSP bereitgestellt wird, leitet das mod-jk Modul die Anfrage an den Tomcat Servlet Container weiter. Der Tomcat Servlet Container empfängt die weitergeleitete Anfrage und verarbeitet sie mittels der konfigurierten Servlets und JSPs. Die dynamisch generierten Inhalte werden erstellt und als Antwort vorbereitet. Die generierte Antwort wird vom Tomcat Servlet Container zurück an den Apache HTTP Server gesendet, der die endgültige Antwort an den Client zurückgibt. Internet Information Services ist eine Diensteplattform des Unternehmens Microsoft für PCs und Server. Über sie können Dokumente und Dateien im Netzwerk zugänglich gemacht werden. Als Kommunikationsprotokolle kommen hierbei HTTP, HTTPS, FTP, SMTP, POP3 und andere zum Einsatz. Über IIS können ASP- oder .NET-Applikationen (ASP.NET) ausgeführt werden, sowie mit den passenden installierbaren Isapi-Filtern (Internet Server API) auch PHP und JSP. Hier sehen Sie den Ablauf einer HTTP-Anfrage und Antwort innerhalb der Microsoft Internet Information Services (IIS) Umgebung. Der Prozess beginnt wieder mit einem Client, der eine HTTP-Anfrage sendet. Diese Anfrage kann verschiedene Dateitypen wie aspx, asp oder html umfassen. Die Anfrage erreicht den IIS-Server, der die initiale Verarbeitung übernimmt. Innerhalb des IIS-Servers kommt das Isapi zum Einsatz, speziell für ASP.NET-Anfragen. Das Isapi-Modul, in diesem Fall ASP.NET Isapi, leitet die Anfrage an den Prozess inetinfo.exe weiter, der in der Version IIS 5.x des Servers läuft. Nach der initialen Verarbeitung durch den IIS-Server wird die Anfrage über eine sogenannte Named-Pipe an den Prozess aspnet\_wp.exe weitergeleitet. Dieser Prozess gehört zur HTTP Runtime Environment, die für die Verarbeitung von ASP.NET-Anfragen zuständig ist. Innerhalb dieser Umgebung wird die eigentliche Geschäftslogik der Webanwendung ausgeführt, einschließlich der Verarbeitung von Serverseitenskripten und der Generierung dynamischer Inhalte. Sobald die Verarbeitung abgeschlossen ist, wird die generierte HTTP-Antwort zurück an den IIS-Server gesendet, der sie dann an den ursprünglichen Client weiterleitet. Der Client empfängt schließlich die HTTP-Antwort, die die angeforderten Inhalte, wie zum Beispiel HTML-Seiten, enthält. Kommen wir abschließend zu einer typischen Server-Infrastruktur, die auf dem Apache-Webserver basiert. LAMP ist die Abkürzung für eine Kombination von verschiedener Software, um dynamische Webseiten zur Verfügung zu stellen. Dazu gehört das Betriebssystem Linux mit dem Webserver Apache, der Datenbank MySQL oder MariaDB und der Programmier- beziehungsweise Skriptsprache PHP. Die ursprüngliche LAMP-Infrastruktur gibt es heute in vielen Abwandlungen, da immer mehr freie Software (zum Beispiel Webserver) veröffentlicht wurden. Mit dem Betriebssystem Windows ergibt sich WAMP, mit macOS heißt es MAMP. Die wohl bekannteste Variante ist XAMPP, bei der das X für "cross-platform" steht, ein spezifisches Betriebssystem wird also nicht angegeben. Die Abbildung zeigt die LAMP-Infrastruktur. Das Betriebssystem Linux bildet die Grundlage dieser Infrastruktur und sorgt für die grundlegenden Systemfunktionen und die Netzwerkkommunikation über die Netzwerkkarte. Der Apache Webserver ist auf dem Linux-Betriebssystem installiert und dient zur Verarbeitung von HTTP-Anfragen. Er stellt statische Inhalte wie HTML, JPEG, PDF und XML-Dateien direkt aus dem Dokumentenstammverzeichnis zur Verfügung. Dynamische Inhalte hingegen werden durch den PHP-Interpreter generiert, der in den Apache Webserver integriert ist. Der PHP-Interpreter führt die serverseitigen Skripte aus, die zur Erstellung dynamischer Webseiten erforderlich sind. Um Datenbanken zu nutzen, wird das Modul php5-mysql verwendet, das die Verbindung zwischen PHP und dem MySQL-Datenbankserver herstellt. Der MySQL-Datenbankserver verwaltet die Datenbankinhalte und ermöglicht den Zugriff auf gespeicherte Daten, die für die dynamische Generierung von Webseiten erforderlich sind. Diese Infrastruktur ermöglicht es, eine Vielzahl von Dateitypen effizient zu verwalten und sowohl statische als auch dynamische Inhalte bereitzustellen.